package com.hds.test.TemplatePattern;

/**
 * 抽象基类
 */
public abstract class RefreshBeverage {

    /**
     *  禁止子类对模版方法复写
     *  封装了所有子类共同的算法框架
     */
    public final void prepareBeverageTemplate() {
         // 将水煮沸
        boilWater();
        // 泡制饮料
        brew();
        // 将饮料倒入杯中
        pourCup();

        if(custom()){
            // 加入调味剂
            addCondiments();
        }


    }

    /**
     * 钩子函数 - 子类通过覆盖的形式挂在钩子函数
     * @return
     */
    protected boolean custom(){
        return true;
    }

    private void boilWater() {
        System.out.println("泡制饮料");
    }

    private void pourCup() {
        System.out.println("将饮料倒入杯中");
    }

    protected abstract void brew();

    protected abstract void addCondiments();
}
